package com.sakura.socket.controller;

import cn.hutool.json.JSONUtil;
import com.sakura.service.ManagerService;
import com.sakura.socket.encoder.ServerEncoder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.time.LocalTime;
import java.util.*;

/**
 * WebSocket服务 这里是来接收前端发送到后端的服务，也即是老人发送求助信息的
 * 这里"/ws/{sid}"主要是管理员上线之后连接上线，方便接收求助信息
 */
@Component
@ServerEndpoint(value = "/websocket/{sid}", encoders = ServerEncoder.class)
public class WebSocketServer {

    @Autowired
    private ManagerService managerService;

    //存放会话对象
    private static Map<String, Session> sessionMap = new HashMap();

    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("sid") String sid) {
//        这里的sid可以存储一个人的用户id
//        谁谁谁上线了，将会话信息存储到map中
        System.out.println("客户端：" + sid + "建立连接");
        sessionMap.put(sid, session);
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message, @PathParam("sid") String sid) {
        System.out.println("收到来自客户端：" + sid + "的信息:" + message);
    }

    /**
     * 连接关闭调用的方法
     *
     * @param sid
     */
    @OnClose
    public void onClose(@PathParam("sid") String sid) {
//        这里会显示哪一个客户下线，可以在下线之前给这个好友的所有人发一条好友上线的信息，将会话信息从map中删除
        System.out.println("连接断开:" + sid);
        sessionMap.remove(sid);
    }

    /**
     * 群发
     *
     * @param
     */
    public static void sendToAllClient(Map<String, Object> message) {
        Collection<Session> sessions = sessionMap.values();
        for (Session session : sessions) {
            try {
                //服务器向客户端发送消息
                session.getBasicRemote().sendText(JSONUtil.toJsonStr(message));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 只发送给我好友
     *
     * @param message
     */
    public void sendToMyFriend(String message) throws IOException {
//        先从数据库中拿出所有我的好友，将id简化成一个集合
        List<String> friends = new ArrayList<>();
        friends.add("Sakura");
        friends.add("lc");
        friends.add("wp");
        for (String friend : friends) {
            Session session = sessionMap.get(friend);
            session.getBasicRemote().sendText(message);
        }
    }

    /**
     * 发送对象到前端去接收
     *
     * @param context:
     * @return void
     * @author Sakura
     * @date 2023/10/15 16:07
     */
    public void sendObject(String context) {
        Collection<Session> sessions = sessionMap.values();
        for (Session session : sessions) {
            try {
                //服务器向客户端发送消息
                Map<String, Object> hashMap = new HashMap();
                hashMap.put("uid", 1);
                hashMap.put("context", context);
                hashMap.put("time", LocalTime.now());
                session.getBasicRemote().sendObject(hashMap);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 发送到我的管理员去接收
     * @param :
     * @return void
     * @author Sakura
     * @date 2024/1/2 14:48
     */
    public void sendMyGrid(Long gridId, Long id) {
        Session session = sessionMap.get(gridId);
        Map<String, Object> hashMap = new HashMap();
        hashMap.put("id", id);
        hashMap.put("time", LocalTime.now());
        try {
            if (session!= null) {
                session.getBasicRemote().sendObject(hashMap);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (EncodeException e) {
            e.printStackTrace();
        }
    }

    public Session getMyGridSession(String gridId) {
        Session session = sessionMap.get(gridId);
        return session;
    }


}

